package com.letv.core.network.volley;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URL;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.ProtocolVersion;
import org.apache.http.StatusLine;
import org.apache.http.entity.BasicHttpEntity;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;

import android.text.TextUtils;

import com.letv.core.bean.UploadFileBean;
import com.letv.core.network.volley.listener.HttpStack;
import com.letv.core.utils.BaseTypeUtils;
import com.letv.core.utils.LogInfo;

/**
 * HttpUrlConnection方式执行上传文件请求
 * 
 * @author zhuqiao
 *
 */
public class HurlFileStack implements HttpStack {

    @SuppressWarnings("resource")
    @Override
    public HttpResponse performRequest(VolleyRequest<?> request) {
        if (TextUtils.isEmpty(request.getUrl())) {
            return null;
        }

        Socket socket = null;
        OutputStream outStream = null;
        try {
            final String BOUNDARY = "---------------------------7da2137580612"; // 数据分隔线
            final String endline = "--" + BOUNDARY + "--\r\n";// 数据结束标志
            LogInfo.log("post", "urlPath =" + request.getUrl());
            int fileDataLength = 0;
            if (!BaseTypeUtils.isArrayEmpty(request.getFileBody())) {
                for (UploadFileBean uploadFile : request.getFileBody()) {// 得到文件类型数据的总长度
                    StringBuilder fileExplain = new StringBuilder();
                    fileExplain.append("--");
                    fileExplain.append(BOUNDARY);
                    fileExplain.append("\r\n");
                    fileExplain.append("Content-Disposition: form-data;name=\"" + uploadFile.getParameterName()
                            + "\";filename=\"" + uploadFile.getFilname() + "\"\r\n");
                    fileExplain.append("Content-Type: " + uploadFile.getContentType() + "\r\n\r\n");
                    fileDataLength += fileExplain.length();
                    if (uploadFile.getInStream() != null) {
                        fileDataLength += uploadFile.getFile().length();
                    } else {

                        if (uploadFile.getData() != null) {

                            fileDataLength += uploadFile.getData().length;
                        }
                    }
                    fileDataLength += "\r\n".length();
                }
            }

            StringBuilder textEntity = new StringBuilder();
            if (!BaseTypeUtils.isMapEmpty(request.getPostFileBody())) {
                for (Map.Entry<String, String> entry : request.getPostFileBody().entrySet()) {// 构造文本类型参数的实体数据
                    textEntity.append("--");
                    textEntity.append(BOUNDARY);
                    textEntity.append("\r\n");
                    textEntity.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"\r\n\r\n");
                    textEntity.append(entry.getValue());
                    textEntity.append("\r\n");
                }
            }
            // 计算传输给服务器的实体数据总长度
            int dataLength = textEntity.toString().getBytes().length + fileDataLength + endline.getBytes().length;

            URL url = new URL(request.getUrl());
            int port = url.getPort() == -1 ? 80 : url.getPort();
            socket = new Socket(InetAddress.getByName(url.getHost()), port);
            outStream = socket.getOutputStream();
            // 下面完成HTTP请求头的发送
            String requestmethod = "POST " + url.getPath() + " HTTP/1.1\r\n";
            outStream.write(requestmethod.getBytes());
            String accept = "Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*\r\n";
            outStream.write(accept.getBytes());
            String language = "Accept-Language: zh-CN\r\n";
            outStream.write(language.getBytes());
            String contenttype = "Content-Type: multipart/form-data; boundary=" + BOUNDARY + "\r\n";
            outStream.write(contenttype.getBytes());
            String contentlength = "Content-Length: " + dataLength + "\r\n";
            outStream.write(contentlength.getBytes());
            String alive = "Connection: Keep-Alive\r\n";
            outStream.write(alive.getBytes());
            String host = "Host: " + url.getHost() + ":" + port + "\r\n";
            outStream.write(host.getBytes());
            // 写完HTTP请求头后根据HTTP协议再写一个回车换行
            outStream.write("\r\n".getBytes());
            // 把所有文本类型的实体数据发送出来
            outStream.write(textEntity.toString().getBytes());

            LogInfo.log("post", "textEntity.toString() =" + textEntity.toString());
            // 把所有文件类型的实体数据发送出来
            if (!BaseTypeUtils.isArrayEmpty(request.getFileBody())) {
                for (UploadFileBean uploadFile : request.getFileBody()) {
                    StringBuilder fileEntity = new StringBuilder();
                    fileEntity.append("--");
                    fileEntity.append(BOUNDARY);
                    fileEntity.append("\r\n");
                    fileEntity.append("Content-Disposition: form-data;name=\"" + uploadFile.getParameterName()
                            + "\";filename=\"" + uploadFile.getFilname() + "\"\r\n");
                    fileEntity.append("Content-Type: " + uploadFile.getContentType() + "\r\n\r\n");
                    outStream.write(fileEntity.toString().getBytes());
                    LogInfo.log("post", "fileEntity.toString() =" + fileEntity.toString());
                    if (uploadFile.getInStream() != null) {
                        byte[] buffer = new byte[1024];
                        int len = 0;
                        while ((len = uploadFile.getInStream().read(buffer, 0, 1024)) != -1) {
                            outStream.write(buffer, 0, len);
                        }
                        if (uploadFile != null && uploadFile.getInStream() != null) {

                            uploadFile.getInStream().close();
                        }
                    } else {

                        if (uploadFile.getData() != null) {

                            outStream.write(uploadFile.getData(), 0, uploadFile.getData().length);
                        }
                    }
                    outStream.write("\r\n".getBytes());
                }
            }
            // 下面发送数据结束标志，表示数据已经结束
            outStream.write(endline.getBytes());

            InputStream is = socket.getInputStream();
            if (is == null) {
                return null;
            }
            StringBuilder sb = new StringBuilder();
            byte[] buf = new byte[512];
            int n = 0;
            while ((n = is.read(buf)) != -1) {
                sb.append(new String(buf));
            }
            String result = sb.toString();
            if (TextUtils.isEmpty(result)) {
                return null;
            }

            int responseCode = (result.indexOf("200") != -1) ? 200 : -1;
            if (responseCode == -1) {
                // no valid response code
                return null;
            }

            result = result.substring(result.indexOf("{"), result.lastIndexOf("}") + 1);
            StatusLine responseStatus = new BasicStatusLine(new ProtocolVersion("HTTP", 1, 1), responseCode, result);
            BasicHttpResponse response = new BasicHttpResponse(responseStatus);
            BasicHttpEntity entity = new BasicHttpEntity();
            entity.setContent(is);
            response.setEntity(entity);
            return response;
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            if (outStream != null) {
                outStream.flush();
                outStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
